package com.xoa.service.workflow.relationFunc;

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.xoa.dao.workflow.FlowFormTypeMapper;
import com.xoa.dao.workflow.FormSortMapper;
import com.xoa.dao.workflow.RelationFuncMapper;
import com.xoa.model.workflow.*;
import com.xoa.service.WFE.WFELog.WFELog;
import com.xoa.util.Constant;
import com.xoa.util.LimsJson;
import com.xoa.util.ToJson;
import com.xoa.util.common.L;
import com.xoa.util.common.StringUtils;
import com.xoa.util.page.PageParams;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import java.util.*;

@Service
public class RelationFuncServiceImpl {
    @Resource
    private RelationFuncMapper relationFuncMapper;

    @Resource
    private FlowFormTypeMapper flowFormTypeMapper;

    @Resource
    private FormSortMapper formSortMapper;

    @Resource
    private WFELog wfeLog;

    //查询所有
    public LimsJson selectAllRalationFunc(String type, Integer parentId, Integer page, Integer limit) {
        LimsJson json = new LimsJson(1, "error");
        Map map=new HashMap();
        PageParams pageParams=new PageParams();
        pageParams.setPageSize(limit);
        pageParams.setPage(page);
        map.put("page",pageParams);
        try {
            if(!StringUtils.checkNull(type) && type.equals("0")){
                map.put("parentId",0);
            }else{
                map.put("parentId",parentId);
            }
            List<RelationFuncWithBLOBs> relationFunc = relationFuncMapper.queryAll(map);
            for(RelationFunc relationFunc1:relationFunc){
                RelationFunc relationFunc2=relationFuncMapper.selectByPrimaryKey(relationFunc1.getRelationParentId());
                if(relationFunc2!=null){
                    relationFunc1.setRelationParentName(relationFunc2.getFuncName());
                }
            }
            if (relationFunc.size() > 0) {
                json.setMsg("查询成功");
                json.setData(relationFunc);
                json.setCount(pageParams.getTotal());
                json.setCode(0);
            }else{
                json.setMsg("暂无数据");
                json.setCode(0);
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        return json;
    }

    //添加
    public LimsJson insertRelationFunc(RelationFuncWithBLOBs relationFunc, HttpServletRequest request) {
        LimsJson json = new LimsJson(1, "error");
        if(relationFunc.getRelationParentId()==0||relationFunc.getRelationParentId()==null){
            FlowFormType flowFormType =new FlowFormType();
            if(relationFunc!=null&&!StringUtils.checkNull(relationFunc.getJsonValue())){
                //这个截取查看 creatFormTypeH5 的返回值
                String[] formHtml = creatFormTypeH5(relationFunc.getJsonValue()).split("#");
                if(formHtml.length<1) return json;
                relationFunc.setFuncDesc(formHtml[1]);
                flowFormType.setFormName(relationFunc.getFuncName()+"表单");
                flowFormType.setDeptId(0);
                flowFormType.setPrintModel(formHtml[0]);
                flowFormType.setFormSort(0);
                int res = flowFormTypeMapper.insertSelectParam(flowFormType);
                if(res>0) {
                    //lr 添加工作流程设计日志---新建表单
                    FlowManageLog flowManageLog = wfeLog.getFlowManageLog(request);
                    flowManageLog.setType(Constant.DESIGNTYPE1);
                    flowManageLog.setTableName("");
                    flowManageLog.setFlowId(0000);
                    flowManageLog.setFlowName(flowFormType.getFormName());
                    wfeLog.addFlowManageLog(flowManageLog);
                }
            }
            relationFunc.setRelationParentId(0);
            relationFunc.setFlowFormId(flowFormType.getFormId());
            if(relationFunc.getFuncUrl()==null||relationFunc.getFuncUrl().equals("")){
                relationFunc.setFuncUrl(flowFormType.getFormId().toString());
            }
        }
        int count = relationFuncMapper.insert(relationFunc);
        if (count > 0) {
            json.setMsg("新增成功");
            json.setCode(0);
        } else {
            json.setCode(1);
            json.setMsg("error");
        }
        return json;
    }

    /**
     * 创建作者:   刘 欢
     * 创建日期:   15:53 2020/3/30
     * 方法介绍:   创建表单拼接h5代码
     * 参数说明:   * @param json
     * 返回值类型：java.lang.String
     */

    public String creatFormTypeH5(String json){
        Map jsonMap = com.alibaba.fastjson.JSONObject.parseObject(json);
        String tr = "";
        Map map = new HashMap();
        // 使用Iterator遍历
        Iterator<Map.Entry> it = jsonMap.entrySet().iterator();
        int i = 0;
        while (it.hasNext()) {
            i++;
            Map.Entry entry = it.next();
            tr+= entry.getKey() + "：<input name=\"DATA_" +i+ "\" class=\"form_item\" data-type=\"text\" type=\"text\" title=\""+entry.getValue()+"\"+"
                    + " value=\"\" id=\"DATA_" +i+ "\" orgfontsize=\"\" orgalign=\"left\" orgwidth=\"150\" orgheight=\"\" orghidden=\"0\""
                    + " align=\"left\" style=\"text-align: left; width: 150px;\"/>";
            map.put(entry.getValue(),"DATA_"+i);
        }
        String mts = JSON.toJSONString(map);
        return tr+"#"+mts;
    }
    //根据id删除
    public LimsJson delRelationFunc(String ids) {
        LimsJson json = new LimsJson(1, "error");
        String[] idArray=ids.split(",");
        try {
            int count = relationFuncMapper.deleteByIds(idArray);
            if (count > 0) {
                json.setMsg("删除成功");
                json.setCode(0);
            }
        } catch (Exception e) {
            json.setMsg(e.getMessage());
            L.e("RelationFunc delRelationFunc:" + e);
            e.printStackTrace();
        }
        return json;
    }

    //根据id查询单个资产类别信息
    public LimsJson selRelationFuncById(Integer relationId) {
        LimsJson json = new LimsJson(1, "error");
        try {
            RelationFunc eduFixAssetsType = relationFuncMapper.selectByPrimaryKey(relationId);
            json.setObject(eduFixAssetsType);
            json.setMsg("查询成功");
            json.setCode(0);
        } catch (Exception e) {
            json.setMsg(e.getMessage());
            e.printStackTrace();
        }
        return json;
    }

    //根据id更改信息
    @Transactional
    public LimsJson updateRelationFuncById(RelationFuncWithBLOBs relationFunc, HttpServletRequest request) {
        LimsJson json = new LimsJson(1, "error");
        if(relationFunc!=null&&relationFunc.getRelationParentId()==0){
            //这个截取查看  updataFormTypeH5 返回值.
            String[] formHtml = updataFormTypeH5(relationFunc.getJsonValue(),relationFunc.getRelationId()).split("#");
            //修改表单
            FlowFormTypeExtends flowFormType =new FlowFormTypeExtends();
            flowFormType.setFormId(relationFunc.getFlowFormId());
            flowFormType.setPrintModel(formHtml[0]);
            int res = flowFormTypeMapper.updateSelectParam(flowFormType);
            //修改表单成功，开始修改应用
            if(res == 0) return json;
            relationFunc.setFuncDesc(formHtml[1]);
        }
        int count = relationFuncMapper.updateByPrimaryKeyWithBLOBs(relationFunc);
        if (count > 0) {
            json.setMsg("修改成功");
            json.setCode(0);
        }
        return json;
    }

    /**
     * 创建作者:   刘 欢
     * 创建日期:   17:36 2020/3/30
     * 方法介绍:   表单修改
     * 参数说明:   * @param json
     * @param relationId
     * 返回值类型：java.lang.String
     */

    public String updataFormTypeH5(String json,Integer relationId){
        RelationFuncWithBLOBs  relationFunc =  relationFuncMapper.selectByPrimaryKey(relationId);
        String tr = "";
        //arr 【客户名称：custemerName，英文：English】
        //将前台的json转换程map
        Map jsonMap = JSONObject.parseObject(json);
        List dataList = new ArrayList();
        //拿到我们做的对应关系
        Map map = JSONObject.parseObject(relationFunc.getFuncDesc());
        Iterator<Map.Entry> itMap = map.entrySet().iterator();
        while (itMap.hasNext()) {
            Map.Entry entry = itMap.next();
            dataList.add(entry.getValue());
        }
        // 使用Iterator遍历
        Iterator<Map.Entry> it = jsonMap.entrySet().iterator();
        while (it.hasNext()) {
            Map.Entry entry = it.next();
            //循环传过来的json串
            //因为我们将json串里面的键值对和 DATA_x做了对应，所以我们现在就是只需要将对应的值重新生成一次。
            String data = (String) map.get(entry.getValue());
            if(data!=null){
                //这个判断表示，可以使用json传里面的value值拿到对应的data_X，
                // 所以我们就是用对应的关系继续生成
                tr+= entry.getKey()
                        + "：<input name=\""+map.get(entry.getValue())+"\" class=\"form_item\" data-type=\"text\" type=\"text\" title=\""+entry.getValue()+"\""
                        + " value=\"\" id=\""+map.get(entry.getValue())+"\" orgfontsize=\"\" orgalign=\"left\" orgwidth=\"150\" orgheight=\"\" orghidden=\"0\""
                        + " align=\"left\" style=\"text-align: left; width: 150px;\"/>";
            }else{
                //这个判断表示，可以使用json传里面的value值拿不到对应的data_X，
                // 表示是新增的字段，所以我们就新添加data_x，新加的规律是，先默认一个数值d然后判断DATA_d有没有在
                //数组dataList中，如果在，表示是已经存在的对应关系，所以自增，在赋值，继续判断，直到while 为false。
                int d= dataList.size();
                String dataValue = "DATA_"+d;
                while (dataList.contains(dataValue)){
                    d++;
                    dataValue = "DATA_"+d;
                }
                tr+= entry.getKey()
                        + "：<input name=\""+dataValue+"\"class=\"form_item\" data-type=\"text\" type=\"text\" title=\""+entry.getValue()+"\""
                        + " value=\"\" id=\""+dataValue+"\" orgfontsize=\"\" orgalign=\"left\" orgwidth=\"150\" orgheight=\"\" orghidden=\"0\""
                        + " align=\"left\" style=\"text-align: left; width: 150px;\"/>";
                map.put(entry.getValue(),dataValue);
                dataList.add(dataValue);
            }
        }
        String mts = JSON.toJSONString(map);
        return tr+"#"+mts;
    }
    public ToJson selectRalationFunc(Integer formId){
        ToJson json=new ToJson<>(1,"err");
        List<RelationFuncWithBLOBs> list=relationFuncMapper.queryAllChild(formId);
        if(list!=null && list.size()>0){
            json.setObj(list);
            json.setFlag(0);
            json.setMsg("查询成功");
        }
        return json;
    }
}
